﻿#ifndef CIMGENHANCE_H
#define CIMGENHANCE_H
#include "SIMD/vectorclass.h"
#include <opencv2/opencv.hpp>

class CImgEnhance
{
public:
    CImgEnhance();
    ~CImgEnhance();

    /**
     * @brief 构建幂变换查找表
     * @param fc    亮度
     * @param fg    对比度
     * @return
     */
    void power_tableBuild(float fc,float fg);

    /**
     * @brief 幂变换   s = c * r^y
     * @param src   原图
     * @param dst   处理图
     * @param fc    亮度
     * @param fg    对比度
     * @return true success
     */
    bool power_transform(cv::Mat &src,cv::Mat &dst,float fc,float fg);

    /**
     * @brief 构建取反变换查找表
     */
    void reverse_tableBuild();

    /**
     * @brief 取反变换
     * @param src   原图
     * @param dst   处理图
     * @return
     */
    bool reverse_transform(cv::Mat &src,cv::Mat &dst);

    /**
     * @brief 直方图均衡化
     * @param mInput    原图
     * @param mOutput   处理图
     * @return
     */
    bool HistEqualization(cv::Mat& mInput, cv::Mat& mOutput);

    /**
     * @brief 构建对数变换查找表
     * @param fc
     * @return
     */
    bool log_tableBuild(float fc);

    /**
     * @brief 对数变换
     * @param src   原图
     * @param dst   处理图
     * @return
     */
    bool log_transform(cv::Mat &src,cv::Mat &dst,float fc);

    //------------------------------------------------------------------------SIMD复现
    /**
     * @brief 构建幂变换像素映射表
     * @param fc    亮度
     * @param fg    对比度
     * @return
     */
    void power_tableBuildSIMD(float fc,float fg);

    /**
     * @brief SIMD 幂变换   s = c * r^y
     * @param src   原图
     * @param dst   处理图
     * @param fc    亮度
     * @param fg    对比度
     * @return true success
     */
    bool power_transformSIMD(cv::Mat &src,cv::Mat &dst,float fc,float fg);




private:
    uchar *powerTransfTable; //幂变换像素映射表
    uchar *logTransfTable;
    uchar *revseTransfTable;
};

#endif // CIMGENHANCE_H
